#include<iostream>
#include<vector>
#include<algorithm>
// int main()
// {
//     auto add1 = [](int x, int y){return x + y;};
//     std::cout << add1(1,1) << std::endl; 
//     //捕获列表和参数列表以及返回值没有可以省略
//     auto func1 = []
//     {std::cout << "hello ylz" << std::endl;};
//     func1();

//     int a = 0, b = 1;
//     auto swap1 = [](int& x,int& y)
//     {
//         int tmp = x;
//         x = y;
//         y = tmp;
//     };
//     swap1(a,b);
//     std::cout << a << " " << b << std::endl;
//     return 0;
// }


//lambda表达式的应用

// struct Goods
// {
//     std::string _name;//姓名
//     double _price;//价格
//     int _evaluate;//评价
//     Goods(const char*str,double price,int evaluate)
//     :_name(str),
//      _price(price),
//      _evaluate(evaluate)
//      {

//      }
// };
// struct ComparePriceGreater//降序
// {
//     //gl是后面,gr是前面
//    bool operator()(const Goods& gl,const Goods& gr)
//    {
//     return gl._price < gr._price;
//    } 
// };

// struct ComparePriceLess//升序
// {
//     //gl是后面,gr是前面
//    bool operator()(const Goods& gl,const Goods& gr)
//    {
//     return gl._price > gr._price;
//    } 
// };
// int main()
// {
//     std::vector<Goods> v = {{"苹果",2.1,5},{"香蕉",3,4},{"菠萝",1.5,5},{"橙子",3,4}};
//     //根据商品不同的属性排序,以前的做法仿函数
//     sort(v.begin(),v.end(),ComparePriceGreater());
//     sort(v.begin(),v.end(),ComparePriceLess());

//     //现在的做法lambda表达式
//     sort(v.begin(),v.end(),[](const Goods& gl ,const Goods& gr) //升序
//         {return gl._price < gr._price;}
//     );
//     sort(v.begin(),v.end(),[](const Goods& gl ,const Goods& gr) //降序
//         {return gl._price > gr._price;}
//     );
//     return 0;
// }




int main()
{
    int a = 0, b = 1, c = 2, d = 3;
    auto func1 = [a,&b]
    {
        //值捕捉的变量不能修改,引用捕捉的可以修改,值引用类似于加上了const
        //a++;
        b++;
    };
    //func1();
    std::cout << "a = " << a << "   " << "b = " << b << std::endl;

    //全部都隐式值捕获
    auto func2 = [=]
    {
        //捕获的值不能修改
        //a++;
        return a + b + c + d;
    };
    std::cout << func2() << std::endl;

    //全部都引用值捕获
    auto func3 = [&]
    {
        //捕获的值不能修改
        a++;
        b++;
        c++;
        d++;
        return a + b + c + d;
    };
    std::cout << func3() << std::endl;
    //引用捕获的值在外面也会修改
    std::cout << "a = " << a << "   " << "b = " << b << std::endl;

    //混合捕捉&或=必须放在第一位
    auto func4 = [&,a,b]//除了a和b其他的都会引用捕捉捕捉,a和b是值捕捉
    {
        //a++;
        //b++;
        c++;
        d++;
        return a + b + c + d;
    };
    func4();
    std::cout << "c = " << c << "   " << "d = " << d << std::endl;

    auto func5 = [=,&a,&b]//除了a和b其他的都会值捕捉,a和b是引用捕捉
    {
        a++;
        b++;
        //c++;
        //d++;
        return a + b + c + d;
    };
    func5();
    std::cout << "a = " << a << "   " << "b = " << b << std::endl;


    auto func7 = [=] () mutable//类似于函数的浅拷贝,在内部做的改变不会影响外部
    {
        a++;
        b++;
        c++;
        d++;
        return a + b + c + d;
    };
    std::cout << a << " " << b << " " << c << " " << d << std::endl;
    return 0;
}
